package com.smartboot.plus.service;

import com.smartboot.plus.api.ResultCode;
import com.smartboot.plus.condition.ConditionGroup;
import com.smartboot.plus.condition.ConditionQ;
import com.smartboot.plus.enums.BrokerStatueEnum;
import com.smartboot.plus.exception.ServiceException;
import com.smartboot.plus.ignite.IgniteCacheRegion;
import com.smartboot.plus.ignite.IgniteQueryExecutor;
import com.smartboot.plus.ignite.cache.MqttNodeCache;
import com.smartboot.plus.page.IPage;
import com.smartboot.plus.utils.Func;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import tech.smartboot.feat.cloud.annotation.Autowired;
import tech.smartboot.feat.cloud.annotation.Bean;
import tech.smartboot.feat.cloud.annotation.PostConstruct;

import java.sql.Timestamp;

/**
 * MQTT节点服务类，实现了IgniteQueryExecutor接口。
 * 提供对MQTT节点的CRUD操作及查询功能。
 */
@Bean
public class MqttNodeService implements IgniteQueryExecutor<MqttNodeCache> {

    @Autowired
    private Ignite igniteInstance;


    /**
     * 获取Ignite缓存实例。
     *
     * @return Ignite缓存实例
     */
    @Override
    public IgniteCache<String, MqttNodeCache> getIgniteCache() {
        return igniteInstance.cache(IgniteCacheRegion.MQTT_NODE_CACHE.getCacheName());
    }

    @PostConstruct
    public void init() {
        // 初始化逻辑可以在这里添加
    }


    /**
     * 分页查询节点信息。
     *
     * @param page          分页对象
     * @param nodeId        节点ID（可选）
     * @param clusterStatus 集群状态（可选）
     * @param status        状态（可选）
     * @return 分页结果集
     */
    public IPage<MqttNodeCache> selectPage(IPage<MqttNodeCache> page, String nodeId, String clusterStatus, String status) {

        ConditionGroup conditionGroup = new ConditionGroup()
                .add(ConditionQ.like(MqttNodeCache::getNodeId, nodeId))
                .add(new ConditionQ(MqttNodeCache::getClusterStatus, clusterStatus))
                .add(new ConditionQ(MqttNodeCache::getStatus, status));
        return this.selectPage(page, conditionGroup, MqttNodeCache.class);

    }

    /**
     * 更新节点的集群状态。
     *
     * @param nodeId            节点ID
     * @param clusterSwitch 新的集群状态
     * @return 是否更新成功
     */
    public boolean updateSwitch(String nodeId, Integer clusterSwitch) {
        // TODO: 实现SQL查询和更新逻辑
        if (Func.isBlank(nodeId) || Func.isEmpty(nodeId)) {
            throw new ServiceException(ResultCode.PARAM_MISS.getMessage());
        }
        MqttNodeCache mqttNodeCache = this.selectOne(new ConditionGroup().add(new ConditionQ(MqttNodeCache::getNodeId, nodeId))
                , MqttNodeCache.class);
        if (Func.isEmpty(mqttNodeCache)) {
            return false;
        }
        mqttNodeCache.setClusterSwitch(clusterSwitch);
        mqttNodeCache.setUpdatedAt(new Timestamp(System.currentTimeMillis()));

        this.getIgniteCache().put(nodeId,mqttNodeCache);
        return true;
    }

    /**
     * 删除指定节点。
     *
     * @param nodeId 节点ID
     * @return 是否删除成功
     */
    public boolean remove(String nodeId) {
        if (Func.isBlank(nodeId) || Func.isEmpty(nodeId)) {
            throw new ServiceException(ResultCode.PARAM_MISS.getMessage());
        }
        MqttNodeCache mqttNodeCache = this.selectOne(new ConditionGroup().add(new ConditionQ(MqttNodeCache::getNodeId, nodeId)), MqttNodeCache.class);
        if (Func.isEmpty(mqttNodeCache)) {
            return false;
        }
        if (!mqttNodeCache.getStatus().equals(BrokerStatueEnum.STOPPED.getCode())) {
            throw new ServiceException("节点正在运行，无法删除");
        }
        this.removeById(nodeId);
        return true;
    }
}



